package com.ruoyi.common.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.entity.StorageConfig;
import com.ruoyi.common.mapper.StorageConfigMapper;
import com.ruoyi.common.service.StorageConfigService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

/**
 * 存储配置Service实现类
 */
@Service
public class StorageConfigServiceImpl extends ServiceImpl<StorageConfigMapper, StorageConfig> implements StorageConfigService {

    @Override
    @Cacheable(value = Constants.STORAGE_CONFIG_CACHE, key = "'defaultConfig'")
    public StorageConfig getByStorageType(String storageType) {
        QueryWrapper<StorageConfig> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("storage_type", storageType);
        return baseMapper.selectOne(queryWrapper);
    }
    
    @Override
    @CacheEvict(value = Constants.STORAGE_CONFIG_CACHE, key = "#config.storageType")
    public boolean saveOrUpdateConfig(StorageConfig config) {
        // 如果设置为默认配置，需要将其他配置设为非默认
        if (config.getIsDefault() != null && config.getIsDefault() == 1) {
            StorageConfig update = new StorageConfig();
            update.setIsDefault(0);
            
            QueryWrapper<StorageConfig> queryWrapper = new QueryWrapper<>();
            queryWrapper.ne("storage_type", config.getStorageType());
            
            baseMapper.update(update, queryWrapper);
        }
        
        // 如果是新增，设置状态为启用
        if (config.getId() == null) {
            config.setStatus(1);
        }
        
        return saveOrUpdate(config);
    }
    
    @Override
    public boolean testConnection(StorageConfig config) {
        // 这里实现连接测试逻辑
        // 根据不同的存储类型，使用相应的SDK测试连接
        try {
            // 实际项目中需要根据不同的存储类型实现真实的连接测试
            // 例如：阿里云OSS使用OSSClient进行连接测试
            // 七牛云使用Auth和BucketManager进行测试
            // 腾讯云COS使用COSClient进行测试
            
            // 这里只是模拟测试成功
            return true;
        } catch (Exception e) {
            log.error("存储配置连接测试失败", e);
            return false;
        }


    }

    // 查询默认存储配置（is_default=1）
    @Override
    public StorageConfig getDefaultConfig() {
        QueryWrapper<StorageConfig> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("is_default", 1);
        return baseMapper.selectOne(queryWrapper);
    }

    @Override
    @Cacheable(value = Constants.STORAGE_CONFIG_CACHE, key = "'defaultStorageType'")
    public String getDefaultStorageType() {
        StorageConfig storageConfig = baseMapper.selectOne(Wrappers.<StorageConfig>lambdaQuery()
                .eq(StorageConfig::getIsDefault, 1));
        return storageConfig.getStorageType();
    }

    // 设置默认存储配置
    @Override
    @CacheEvict(value = Constants.STORAGE_CONFIG_CACHE, allEntries = true)
    public boolean setDefaultConfig(String storageType) {
        // 特殊处理：本地存储（local）
        if ("local".equals(storageType)) {
            // 1. 检查本地存储记录是否存在，不存在则创建
            StorageConfig localConfig = getByStorageType("local");
            if (localConfig == null) {
                localConfig = new StorageConfig();
                localConfig.setStorageType("local");
                localConfig.setIsDefault(0);
                baseMapper.insert(localConfig);
            }

            // 2. 将所有配置设为非默认（添加WHERE条件）
            StorageConfig update = new StorageConfig();
            update.setIsDefault(0);
            QueryWrapper<StorageConfig> updateWrapper = new QueryWrapper<>();
            updateWrapper.eq("1", "1"); // 恒真条件，匹配所有记录
            baseMapper.update(update, updateWrapper);

            // 3. 将本地存储设为默认
            localConfig.setIsDefault(1);
            return updateById(localConfig);
        }

        // 非本地存储逻辑
        StorageConfig config = getByStorageType(storageType);
        if (config == null) {
            return false;
        }

        // 将所有配置设为非默认（添加WHERE条件）
        StorageConfig update = new StorageConfig();
        update.setIsDefault(0);
        QueryWrapper<StorageConfig> updateWrapper = new QueryWrapper<>();
        updateWrapper.eq("1", "1"); // 恒真条件
        baseMapper.update(update, updateWrapper);

        // 将指定类型设为默认
        config.setIsDefault(1);
        return updateById(config);
    }

}
